之前看到有 https://aqinco.com/ 这家云服务器有售卖 家庭宽带 IP 购买 的服务,宣称是可以给家庭宽带增加一条静态 IP,出于好奇,我购买了一个月进行尝试。
将云服务器 IP 绑定到本地服务器 & OpenWrt
在客服使用 SSH 连接将 IP 链接到我本地的 Linux 服务器后,我通过查询系统进程和网络接口的方式发现,其实所谓增加静态 IP 不过是使用 WireGuard 将公网 IP 绑定到设备上,于是我产生了一个 大胆 奇妙的想法,能不能将自己手边吃灰的云服务器 IP 绑定到本地,甚至绑定到 OpenWrt 上,经过一番摸索和与 GPT 的深入交流,成功将云服务器 IP 绑定到了本地服务器,这种绑定和 frp 有所不同,所有访问到云服务器 IP 的请求,都将转发到本地服务器,甚至包括 Ping 请求。

将云服务器 IP 绑定到本地服务器 & OpenWrt
正如上图所示,我使用的是腾讯云北京的服务器,正常在北京节点对其 ip 进行 ping 命令,得到的延迟应该在 5ms 以内,但是现在 ping 的延迟增加了从腾讯云北京到我家里的时间。并且现在通过这台服务器的 IP 可以直接访问到我家里的设备。

下面是详细的部署流程。

公网服务器部署 WireGuard

安装 WireGuard

sudo apt update
sudo apt install wireguard

生成秘钥对

# 生成公网服务器的密钥对
wg genkey | tee server_privatekey | wg pubkey > server_publickey

# 生成无公网服务器的密钥对
wg genkey | tee client_privatekey | wg pubkey > client_publickey

密钥对文件保存在当前命令行路径下的 server_privatekey server_publickey 文件和 client_privatekey client_publickey,其中 server_privatekey server_publickey 为公网服务器的私钥与公钥,client_privatekey client_publickey为无公网服务器的私钥与公钥,这两对秘钥需要在妥善保存后删除。

下文中将以以下代称称呼

代称 秘钥文件名称
< 公网服务器的私钥 > server_privatekey
< 公网服务器的公钥 > server_publickey
< 无公网服务器的私钥 > client_privatekey
< 无公网服务器的公钥 > client_publickey

配置 WireGuard

创建并编辑配置文件 /etc/wireguard/wg0.conf

sudo vi /etc/wireguard/wg0.conf

添加以下内容

[Interface]
Address = 10.1.0.1/24
PrivateKey = < 公网服务器的私钥 >
ListenPort = 51820

[Peer]
PublicKey = < 无公网服务器的公钥 >
AllowedIPs = 10.1.0.2/32

将 < 公网服务器的私钥 > 替换为你生成的 privatekey,将 < 无公网服务器的公钥 > 替换为无公网服务器生成的 publickey

启动 WireGuard

sudo wg-quick up wg0

无公网服务器部署 WireGuard

这里先以普通 Ubuntu 服务器为例,如果想在 OpenWrt 上部署,本节主要查看 配置 WireGuard小节即可。

配置 WireGuard

创建并编辑配置文件 /etc/wireguard/wg0.conf

sudo vi /etc/wireguard/wg0.conf

添加以下内容

[Interface]
Address = 10.1.0.2/24
PrivateKey = < 无公网服务器的私钥 >

[Peer]
PublicKey = < 公网服务器的公钥 >
Endpoint = < 公网服务器的 IP>:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25

或者填写

[Interface]
Address = 10.1.0.2/24
PrivateKey = < 无公网服务器的私钥 >

[Peer]
PublicKey = < 公网服务器的公钥 >
Endpoint = < 公网服务器的 IP>:51820
AllowedIPs = 10.1.0.1/32
PersistentKeepalive = 25

启动 WireGuard

sudo wg-quick up wg0

配置端口转发

本节内所有操作均在公网服务器上执行,并建议彻底关闭云服务器上的网络防火墙。

配置 IP 转发

在公网服务器上启用 IP 转发

sudo sysctl -w net.ipv4.ip_forward=1

如果需要永久生效,需编辑 /etc/sysctl.conf并取消 net.ipv4.ip_forward=1 的注释或添加 net.ipv4.ip_forward=1

配置防火墙规则

在公网服务器上使用 iptables 将流量转发到无公网服务器

sudo iptables -t nat -I PREROUTING -p udp --dport 51820 -j ACCEPT
sudo iptables -t nat -A PREROUTING -d < 公网服务器的 IP> -j DNAT --to-destination 10.0.0.2
sudo iptables -t nat -A POSTROUTING -j MASQUERADE

注意!!!这里 < 云服务器的 IP> 有很多大厂的服务器,使用 ip addr 命令查询到的网卡绑定 IP 与实际公网 IP 不同,这里一定要使用 网卡实际绑定的 ip 而不是公网 IP

为了确保规则在重启后仍然有效,保存规则

sudo apt install iptables-persistent
sudo netfilter-persistent save

验证配置

  1. 确认 WireGuard 隧道连接已建立
    sudo wg show
    
  2. 通过公网 IP 测试连接,确保请求能够转发到无公网服务器。

注意
确保公网服务器和无公网服务器的防火墙配置正确,允许必要的端口和协议通过。

OpenWrt 部署 WireGuard

  1. 首先确保 OpenWrt 上安装以下插件

    将云服务器 IP 绑定到本地服务器 & OpenWrt

  2. 插件安装完成后,必须重启路由器,否则无法再接口处查看到 WireGuard 接口。
  3. 网络 -> 接口 -> 添加新接口 输入名称 wg0 和选择 WireGuard VPN 协议
    将云服务器 IP 绑定到本地服务器 & OpenWrt
  4. 编辑接口 -> 导入配置,粘贴 无公网服务器部署 WireGuard一节中 配置 WireGuard中的配置文件即可。
    将云服务器 IP 绑定到本地服务器 & OpenWrt
  5. 将新建接口加入到 wan 防火墙区域
  6. 完成后即可把服务器 IP 当做 OpenWrt 的一个 wan 口接入使用,相当于给你的宽带绑定了一条公网 IP

如果遇到绑定 OpenWrt 后无效的情况,将 AllowedIPs 从 0.0.0.0/ 0 修改为公网服务器 ip 即可,例如:
10.1.0.1/32